import {sm2, sm4} from 'sm-crypto';
import CryptoJS from 'crypto-js';

/**
 * 生成 SM4 密钥
 * @returns {string} 16 字节（128 位）的随机密钥，以十六进制字符串形式返回
 */
export const generateSM4Key = () => {
    return Array.from({ length: 16 }, () => Math.floor(Math.random() * 256))
        .map(byte => byte.toString(16).padStart(2, '0'))
        .join('');
};


/**
 * Base64 编码
 * @param {string} str - 需要编码的字符串
 * @returns {string} Base64 编码后的字符串
 */
export const base64Encode = (str) => {
    return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str));
};

/**
 * Base64 解码
 * @param {string} str - 需要解码的 Base64 字符串
 * @returns {string} 解码后的原始字符串
 */
export const base64Decode = (str) => {
    return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(str));
};

/**
 * SM4 加密
 * @param {string} plaintext - 需要加密的明文
 * @param {string} key - SM4 密钥（16 字节的十六进制字符串）
 * @returns {string} 加密后的密文
 */
export const sm4Encrypt = (plaintext, key) => {
    // 使用 sm-crypto 加密
    return sm4.encrypt(plaintext, key);
};

/**
 * SM4 解密
 * @param {string} ciphertext - 需要解密的密文
 * @param {string} key - SM4 密钥（16 字节的十六进制字符串）
 * @returns {string} 解密后的明文
 */
export const sm4Decrypt = (ciphertext, key) => {
    // 使用 sm-crypto 解密
    return sm4.decrypt(ciphertext, key);
};

/**
 * 生成 SM2 密钥对
 * @returns {Object} 包含公钥和私钥的对象
 */
export const generateSM2KeyPair = () => {
    // 生成 SM2 密钥对
    const keyPair = sm2.generateKeyPairHex();
    return {
        publicKey: keyPair.publicKey, // 公钥
        privateKey: keyPair.privateKey // 私钥
    };
};

/**
 * SM2 加密
 * @param {string} plaintext - 需要加密的明文
 * @param {string} publicKey - SM2 公钥
 * @returns {string} 加密后的密文
 */
export const sm2Encrypt = (plaintext, publicKey) => {
    // 使用 sm2 加密
    return sm2.doEncrypt(plaintext, publicKey);
};

/**
 * SM2 解密
 * @param {string} ciphertext - 需要解密的密文（Base64 编码）
 * @param {string} privateKey - SM2 私钥
 * @returns {string} 解密后的明文
 */
export const sm2Decrypt = (ciphertext, privateKey) => {
    // 使用 sm2 解密
    return sm2.doDecrypt(ciphertext, privateKey);
};